home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / tools / czesc_2 / mfilemode / source / main.c < prev    next >
C/C++ Source or Header  |  1994-09-05  |  4KB  |  229 lines

  1. // Main.c - Copyright © 1994 Mike Austin
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <proto/exec.h>
  6. #include <proto/dos.h>
  7. #include <proto/intuition.h>
  8. #include <proto/gadtools.h>
  9. #include <proto/multiuser.h>
  10. #include <pragmas/nofrag_pragmas.h>
  11. #include <proto/nofrag_protos.h>
  12. #include "MFileMode.h"
  13. #include "GUI.h"
  14.  
  15. const UBYTE    *Version = "$VER: MFileMode 0.9 "__AMIGADATE__;
  16. __aligned struct FileInfoBlock    FileInfo;
  17. struct muBase        *muBase;
  18. struct Library        *NoFragBase;
  19. struct List            FileList;
  20. struct muUserInfo    *UserInfo;
  21. struct muGroupInfo    *GroupInfo;
  22. struct MemoryChain    *MemChain;
  23. UWORD                EntryNum = 0;
  24. UBYTE                **FileNames;
  25. UBYTE                Path[81] = "";
  26. BOOL                Changed = FALSE;
  27. BOOL                Selected = FALSE;
  28.  
  29. struct EasyStruct    EasyReq = {
  30.     sizeof(struct EasyStruct),
  31.     0,
  32.     "MFileMode",
  33.     "%s %s",
  34.     "OK"
  35. };
  36.  
  37. long main(void)
  38. {
  39.     ULONG                Signals, WinSig;
  40.     BOOL                Running = TRUE;
  41.  
  42.     NewList(&FileList);
  43.  
  44.     if(Init())
  45.     {
  46.         if(!SetupScreen())
  47.         {
  48.             if(!OpenMainWindow())
  49.             {
  50.                 MainRender();
  51.  
  52.                 WinSig = 1L << MainWnd->UserPort->mp_SigBit;
  53.  
  54.                 LoadVolumes(&FileList);
  55.  
  56.                 while(Running)
  57.                 {
  58.                     Signals = Wait(WinSig | SIGBREAKF_CTRL_C);
  59.  
  60.                     if(Signals & WinSig)
  61.                     {
  62.                         Running = HandleMainIDCMP();
  63.                     }
  64.                     else if(Signals & SIGBREAKF_CTRL_C)
  65.                     {
  66.                         Running = FALSE;
  67.                     }
  68.                 }
  69.  
  70.                 CloseMainWindow();
  71.             }
  72.             else
  73.                 AlertUser(MainWnd, "Can't open window", "");
  74.  
  75.             CloseDownScreen();
  76.         }
  77.         else
  78.             AlertUser(MainWnd, "Can't set up screen", "");
  79.  
  80.         FreeList(&FileList);
  81.  
  82.         Cleanup();
  83.     }
  84.  
  85.     return 0;
  86. }
  87.  
  88. BOOL Init(VOID)
  89. {
  90.     if(muBase = (struct muBase *)OpenLibrary("multiuser.library", 39))
  91.     {
  92.         if(NoFragBase = OpenLibrary("nofrag.library", 2))
  93.         {
  94.             if(MemChain = GetMemoryChain(4096))
  95.             {
  96.                 if(UserInfo = muAllocUserInfo())
  97.                 {
  98.                     if(GroupInfo = muAllocGroupInfo())
  99.                     {
  100.                         return TRUE;
  101.                     }
  102.  
  103.                     muFreeGroupInfo(GroupInfo);
  104.                 }
  105.                 else
  106.                     AlertUser(NULL, "Can't allocate user info", "");
  107.  
  108.                 FreeMemoryChain(MemChain, TRUE);
  109.             }
  110.             else
  111.                 AlertUser(NULL, "Can't get memory chain", "");
  112.  
  113.             CloseLibrary(NoFragBase);
  114.         }
  115.         else
  116.             AlertUser(NULL, "Can't open nofrag.library", "2.0");
  117.  
  118.         CloseLibrary((struct Library *)muBase);
  119.     }
  120.     else
  121.         AlertUser(NULL, "Can't open multiuser.library ", "39");
  122.  
  123.     return FALSE;
  124. }
  125.  
  126. VOID Cleanup(VOID)
  127. {
  128.     muFreeGroupInfo(GroupInfo);
  129.     muFreeUserInfo(UserInfo);
  130.     FreeMemoryChain(MemChain, TRUE);
  131.     CloseLibrary(NoFragBase);
  132.     CloseLibrary((struct Library *)muBase);
  133. }
  134.  
  135. int MainCloseWindow(VOID)
  136. {
  137.     WriteData();
  138.  
  139.     return FALSE;
  140. }
  141.  
  142. VOID WriteData(VOID)
  143. {
  144.     struct DevProc    *DevProc;
  145.     BPTR            FileLock;
  146.     UBYTE            TempPath[81];
  147.  
  148.     if(Changed && Selected)
  149.     {
  150.         strcpy(TempPath, Path);
  151.         AddPart(TempPath, FileNames[EntryNum], 80);
  152.         ReadGadgets(&FileInfo);
  153.         muSetProtection(TempPath, FileInfo.fib_Protection);
  154.  
  155.         if(DevProc = GetDeviceProc(TempPath, NULL))
  156.         {
  157.             if(FileLock = Lock(TempPath, ACCESS_READ))
  158.             {
  159.                 if(!DoPkt(DevProc->dvp_Port, ACTION_SET_OWNER, 0L, FileLock,
  160.                         MKBADDR(NULL), (LONG)UserInfo->uid << 16 |
  161.                         (LONG)UserInfo->gid, 0L))
  162.                 {
  163.                     AlertUser(MainWnd, "Can't set owner", "");
  164.                 }
  165.  
  166.                 UnLock(FileLock);
  167.             }
  168.             else
  169.                 AlertUser(MainWnd, "Can't lock file", TempPath);
  170.  
  171.             FreeDeviceProc(DevProc);
  172.         }
  173.         else
  174.             AlertUser(MainWnd, "Can't get device proccess", TempPath);
  175.  
  176.         Changed = FALSE;
  177.     }
  178. }
  179.  
  180. VOID FreeList(struct List *List)
  181. {
  182.     struct Node    *Node = List->lh_Head;
  183.     struct Node    *Next;
  184.  
  185.     while(Next = Node->ln_Succ)
  186.     {
  187.         FreeVecItem(MemChain, Node);
  188.  
  189.         Node = Next;
  190.     }
  191.  
  192.     FreeVecItem(MemChain, FileNames);
  193.  
  194.     NewList(&FileList);
  195. }
  196.  
  197. UBYTE *BSTR2CSTR(BSTR BString)
  198. {
  199.     static UBYTE Buffer[255];
  200.     static UBYTE *String;
  201.  
  202.     String = BADDR(BString);
  203.     CopyMem(&(String[1]), Buffer, String[0]);
  204.     Buffer[String[0]] = '\0';
  205.  
  206.     return Buffer;
  207. }
  208.  
  209. VOID AlertUser(struct Window *Win, UBYTE *String, UBYTE *Arg)
  210. {
  211.     struct Requester    Req;
  212.  
  213.     if(Win)
  214.     {
  215.         InitRequester(&Req);
  216.  
  217.         if(Request(&Req, Win))
  218.         {
  219.             EasyRequest(MainWnd, &EasyReq, NULL, String, Arg);
  220.  
  221.             EndRequest(&Req, Win);
  222.         }
  223.     }
  224.     else
  225.     {
  226.         EasyRequest(MainWnd, &EasyReq, NULL, String, Arg);
  227.     }
  228. }
  229.